Estoy familiarizado con NaN siendo "raro" en JavaScript, es decir, NaN === NaN siempre devuelve false , como se describe aquí . Por lo tanto, uno no debe hacer comparaciones === para verificar NaN , sino usar isNaN(..) en su lugar.
Así que me sorprendió descubrir que
> [NaN].includes(NaN) trueEsto parece inconsistente. ¿Por qué tener este comportamiento?
¿Cómo funciona? ¿El método includes comprueba específicamente isNaN ?
Según el documento de MDN dice que
Nota: Técnicamente hablando, include
includes()usa el algoritmosameValueZeropara determinar si se encuentra el elemento dado.
const x = NaN, y = NaN; console.log(x == y); // false -> using 'loose' equality console.log(x === y); // false -> using 'strict' equality console.log([x].indexOf(y)); // -1 (false) -> using 'strict' equality console.log(Object.is(x, y)); // true -> using 'Same-value' equality console.log([x].includes(y)); // true -> using 'Same-value-zero' equalityObject.is() y === está en su tratamiento de los ceros con signo y los NaN.El método .includes() usa el algoritmo SameValueZero para verificar la igualdad de dos valores y considera que el valor de NaN es igual a sí mismo.
El algoritmo SameValueZero es similar a SameValue , pero la única diferencia es que el algoritmo SameValueZero considera que +0 y -0 son iguales.
El método Object.is() usa SameValue y devuelve verdadero para NaN .
console.log(Object.is(NaN, NaN)); El comportamiento del método .includes() es ligeramente diferente del método .indexOf() ; el método .indexOf() usa una comparación de igualdad estricta para comparar valores y la comparación de igualdad estricta no considera que NaN sea igual a sí mismo.
console.log([NaN].indexOf(NaN));Puede encontrar información sobre diferentes algoritmos de verificación de igualdad en MDN: